//package com.woniuxy.education.configuration;
//
//import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
//import com.woniuxy.education.configuration.realm.CustomRealm;
//import com.woniuxy.education.filter.OrFilter;
//import org.apache.shiro.mgt.SecurityManager;
//
//
//import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
//import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
//import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
//import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
//import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//import javax.servlet.Filter;
//import java.util.HashMap;
//import java.util.LinkedHashMap;
//import java.util.Map;
//
//@Configuration   //配置类标志
//public class ShiroConfiguration {
//
//    //1.配置relam:域对象,调用Serveice获取用户账号密码,权限信息
//    @Bean    //<bean> 默认以方法名作为id,此处就是realm
//    public CustomRealm realm(){
//        return new CustomRealm();
//    }
//
//    //2.安全管理器(核心)
//    //7.2 将session管理器交给安全管理器
//    @Bean   //参数就相当于 <property ref="realm" />
//    public SecurityManager securityManager(CustomRealm realm,DefaultWebSessionManager sessionManager){
//        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
//        //设置realm
//        manager.setRealm(realm);
//        //设置 session管理器
//        manager.setSessionManager(sessionManager);
//        //
//        return  manager;
//    }
//
//
//    //3.shiro过滤器
//    //主要来指定那些请求需要认证,那些不需要,那些需要那些权限
//    @Bean
//    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager,OrFilter orFilter){
//        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
//
//        //5.注册自定义的过滤器
//        //javax.servert.filter
//        Map<String, Filter> filterMap=new HashMap<>();
//        filterMap.put("or",orFilter);
//        factoryBean.setFilters(filterMap);
//
//        //配置安全管理器
//        factoryBean.setSecurityManager(securityManager);
//        //配置没有权限时要请求的url()
//        factoryBean.setUnauthorizedUrl("/jump/error.html");//r如果在后台跳,表示前后端不分离
//        //需要登录时但又没有登录,自动跳转到指定的
//        factoryBean.setLoginUrl("/jump/toLogin");
//
//        //设置过滤连
//        Map<String,String> map=new LinkedHashMap<>();
//        //key表示url,, value:标签shiro是过滤器
//        //anon是内置过滤器的名字,表示能够匿名访问
//        map.put("/login.html","anon");
//        map.put("/user/login","anon");
//        map.put("/user/regist","anon");
//        map.put("/student/homework","anon");
//
//        //role 角色,当请求相关url时,匹配到的过滤器为role表示
//        //访问该url必须是[]中指定的角色
//        //[]中的角色是程序员自定义的
//        //当shiro识别到roles过滤器时会自动调用realm中获取授权信息的方法
//        map.put("/admin.html","roles[admin]");
//        map.put("/student.html","roles[student]");
//        map.put("/teacher.html","roles[teacher]");
//
//        //两个角色都拥有才能访问
//        map.put("/adminAndTeacher.html","roles[admin,teacher]");
//        //两个角色都拥有其中一个就能访问
//        map.put("/adminOrTeacher.html","or[admin,teacher]");
//
//        //权限配置
//        map.put("/teacher/add","perms[teacher:add]");
//
//        //使用记住我过滤器
//        map.put("/re/html","user");
//
//        //注销操作
//        map.put("/user/logout","logout");
//
//        //静态资源放行
//        map.put("/html/*","anon");
//        map.put("/css/*","anon");
//        map.put("/js/*","anon");
//        map.put("/images/*","anon");
//
//        //除开以上情况以外的
//        //authc也是内置过滤器的名字,是AuthenticationInfo 的缩写,表示需要认证(登录)才能访问
//        map.put("/**","authc");
//
//        //
//        factoryBean.setFilterChainDefinitionMap(map);
//        return factoryBean;
//    }
//
//    //创建自定义过滤器的bean
//    @Bean
//    public OrFilter orFilter(){
//        return  new OrFilter();
//    }
//
//
//    //6.1配置shiro注解的支持:shiro注解基于AOP实现,分两步
//    @Bean
//    public AuthorizationAttributeSourceAdvisor advisor (SecurityManager securityManager){
//        AuthorizationAttributeSourceAdvisor sourceAdvisor =
//                new AuthorizationAttributeSourceAdvisor();
//        sourceAdvisor.setSecurityManager(securityManager);
//        return sourceAdvisor;
//    }
//
//    //6.2接上.创建代理器
//    @Bean
//    public DefaultAdvisorAutoProxyCreator creator(){
//        DefaultAdvisorAutoProxyCreator proxyCreator=new DefaultAdvisorAutoProxyCreator();
//        //开启目标代理
//        proxyCreator.setProxyTargetClass(true);
//        return proxyCreator;
//    }
//
//    //7.配置session管理器,配置完后放到 2 SecurityManager (安全管理器中)
//    @Bean
//    public DefaultWebSessionManager sessionManager(){
//        DefaultWebSessionManager manager = new DefaultWebSessionManager();
//        //设置过期时间,单位是毫秒
//        manager.setGlobalSessionTimeout(1000*60*60*24);
//        return manager;
//    }
//
//    //8.配置shiro标签的方言
//    @Bean
//    public ShiroDialect dialect(){
//        return new ShiroDialect();
//    }
//
//}
